在了解了 Kubernetes 的好處後,今天我們來更深入地看看 Kubernetes 的重要組成內容。
根據 Kubernetes 實施細節中所述,Kubernetes 叢集的設計基於三個原則:
一個完整的 Kubernetes 叢集由以下主要元件構成:
讓我們更詳細地探究這些組件。
又叫工作節點或計算節點。Kubernetes 叢集中至少需要一個計算節點,但通常會有多個計算節點。容器集經過調度和編排後會在節點上運行。如果需要擴展叢集的容量,就要新增更多的節點。
Pod 是 Kubernetes 對象模型中最小、最簡單的單元。它代表了應用的單個實例。每個 Pod 都由一個容器(Container)以及若干控制容器運行方式的選件組成。Pod 可以連接至持久儲存 (Persistent Storage) 以運行有狀態應用。
每個計算節點都有一個容器運行引擎來執行容器。Docker 是常見的選擇,但 Kubernetes 也支援其他符合開源容器運動(OCI)標準的執行階段,例如 rkt 和 CRI-O。值得注意的是,在 CNCF 認證考試中,默認使用的 Container Runtime 是 containerd
。
kubelet 是每個節點上運行的代理,負責與控制平面通信。它確保 Pod 中的容器按照規格運行,並執行來自控制平面的指令。
每個計算節點中都包含 kube-proxy,它是網絡代理,負責維護節點上的網絡規則,管理進入服務的網路流量並將其轉發到適當的 Pod。
kube-proxy 通常使用 iptables 或 IPVS 來實現這些轉發規則,以確保集群內部和外部的網路請求能夠正確路由到相應的 Pod。
控制平面是 Kubernetes 叢集的神經中樞,負責控制叢集的運行。這裡包含用於控制叢集的 Kubernetes 元件及一些有關叢集狀態和組態的資料。這些核心元件確保容器以足夠的數量和所需的資源運行,並一直保持與您的電腦聯絡,以確保叢集按照預期運行。
Kubernetes API 是控制平面的前端,用於處理內部和外部請求。所有對集群的操作都需要通過 API 服務器進行。API 伺服器會確定請求是否有效,如果有效,則對其進行處理。您可以通過 REST 呼叫、kubectl 命令列介面或其他命令列工具(例如 kubeadm)來訪問 API。
要快速查看可用的 API,可以使用以下命令啟動代理:
kubectl proxy
---
Starting to serve on 127.0.0.1:8001
然後訪問 127.0.0.1:8001
這個端口,查看 API 列表。
kube-scheduler 是 Kubernetes 的調度器,調度器負責將新創建的 Pod 分配到合適的節點上。它考慮因素包括資源需求、硬件/軟件/策略約束、親和性規則等,以做出最優的調度決策。
Kubernetes 控制器 (Controller) 的主要功能是確保叢集的狀態始終符合期望。它們持續監控叢集中的資源,一旦發現實際狀態與期望狀態不符,就會採取相應的行動進行調整。Kubernetes 將多個控制器整合到單一進程中,即控制器管理器 (controller-manager),以減少資源消耗並方便統一管理。
一些重要的控制器如下:
實際上叢集包含了超過 30 個控制器,這些控制器與 Kubernetes 其他元件的協調合作便是確保叢集動起來的關鍵。
某些控制器負責與底層雲服務提供商(如 AWS、GCP、Azure 等)進行交互,以管理 Kubernetes 集群中的資源。cloud-controller-manager 將雲特定的控制邏輯從 Kubernetes 的核心組件 kube-controller-manager 中分離出來,提供更好的可擴展性和靈活性。
常見的雲控制器包括:
在自建環境或本地電腦中運行 Kubernetes,不需要雲控制器管理器。
etcd 是 Kubernetes 的主資料庫,用於存儲所有集群數據。它是一個分布式鍵值存儲,設計用於可靠地存儲關鍵數據。定期備份 etcd 是災難恢復計劃的重要部分。
在一些輕量級的 Kubernetes 發行版中,可以選擇使用更熟悉的 SQLite 作為狀態存儲的替代方案。
Kubernetes 的設計和實現包含了大量元件,且其內容龐大且快速增長。相信大家在初次接觸這些介紹時,可能和我一樣,無法完全理解其中的細節。在後續的主題介紹和實作練習中,我們會再次提及本篇提到的重要元件和概念,並通過實作來加深對它們的理解。